package com.naiterui.ehp.bp.domain.charge;

import static javax.persistence.GenerationType.IDENTITY;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * 医生已开通服务项目
 * @author Amber
 * @since 1.0.0
 */
@Entity
@Table(name = "dr_service_items")
public class DrServiceItems implements Serializable {
    /**
     * 未处理：<code>FETCH_STATUS_UNPROCESSED</code>
     */
    public static final int FETCH_STATUS_UNPROCESSED = 1;
    /**
     * 处理中：<code>FETCH_STATUS_PROCESSING</code>
     */
    public static final int FETCH_STATUS_PROCESSING = 2;
    /**
     * 已完成：<code>FETCH_STATUS_PROCESSED</code>
     */
    public static final int FETCH_STATUS_PROCESSED = 3;
    /**
     * 字段或域定义：<code>serialVersionUID</code>
     */
    private static final long serialVersionUID = 6270566509837038211L;
    /**
     * 主键：<code>id</code>
     */
    private Long id;
    /**
     * 医生id：<code>doctorId</code>
     */
    private Long doctorId;
    /**
     * 已开通的服务：<code>services</code>
     */
    private Integer services;
    /**
     * 数据抓取状态，供搜索服务抓数据使用：<code>fetchStatus</code>
     */
    private Integer fetchStatus;
    /**
     * 创建时间：<code>createdAt</code>
     */
    private Date createdAt;
    /**
     * 修改时间：<code>changedAt</code>
     */
    private Date changedAt;

    public DrServiceItems() {
    }

    /**
     * 构造函数 构造医生开通的服务对象
     * @param doctorId
     * @param services
     */
    public DrServiceItems(Long doctorId, Integer services) {
        super();
        this.doctorId = doctorId;
        this.services = services;
        this.createdAt = new Date();
        this.changedAt = new Date();
        this.fetchStatus = FETCH_STATUS_UNPROCESSED;
    }

    /**
     * @return Long 取得域 id 的方法。
     */
    @Id
    @GeneratedValue(strategy = IDENTITY)
    @Column(name = "id", unique = true, nullable = false)
    public Long getId() {
        return this.id;
    }

    /**
     * @param id 对域 id 的设置方法.
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * @return Long 取得域 doctorId 的方法。
     */
    @Column(name = "doctor_id", unique = true, nullable = false)
    public Long getDoctorId() {
        return this.doctorId;
    }

    /**
     * @param doctorId 对域 doctorId 的设置方法.
     */
    public void setDoctorId(Long doctorId) {
        this.doctorId = doctorId;
    }

    /**
     * @return Integer 取得域 services 的方法。
     */
    @Column(name = "services", nullable = false)
    public Integer getServices() {
        return this.services;
    }

    /**
     * @param services 对域 services 的设置方法.
     */
    public void setServices(Integer services) {
        this.services = services;
    }

    /**
     * @return Integer 取得域 fetchStatus 的方法。
     */
    @Column(name = "fetch_status", nullable = false)
    public Integer getFetchStatus() {
        return this.fetchStatus;
    }

    /**
     * @param fetchStatus 对域 fetchStatus 的设置方法.
     */
    public void setFetchStatus(Integer fetchStatus) {
        this.fetchStatus = fetchStatus;
    }

    /**
     * @return Date 取得域 createdAt 的方法。
     */
    @Column(name = "created_at", nullable = false)
    public Date getCreatedAt() {
        return this.createdAt;
    }

    /**
     * @param createdAt 对域 createdAt 的设置方法.
     */
    public void setCreatedAt(Date createdAt) {
        this.createdAt = createdAt;
    }

    /**
     * @return Date 取得域 changedAt 的方法。
     */
    @Column(name = "changed_at", nullable = false)
    public Date getChangedAt() {
        return this.changedAt;
    }

    /**
     * @param changedAt 对域 changedAt 的设置方法.
     */
    public void setChangedAt(Date changedAt) {
        this.changedAt = changedAt;
    }

    /**
     * 检测开启某项服务
     * DrChargeItems.validateOpenItem()
     * @Author Amber
     * @Date 2016年7月29日
     * @since 1.0.0
     * @param chargeType
     * @return
     */
    public boolean validateOpenItem(int chargeType) {
        if ((this.services & chargeType) == chargeType) {
            return true;
        }
        return false;
    }
}
